﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Xunit;
using MetaSharp.Transformation;

namespace MetaSharp.Transformation.Tests.DataStructures
{
	public class MapTests
	{
		[Fact]
		public void CanGetSuccessfully()
		{
			var m = Map<int, int>.Empty
				.Add(1, 11)
				.Add(2, 22)
				.Add(3, 33);

			Assert.Equal(11, m[1]);
			Assert.Equal(22, m[2]);
			Assert.Equal(33, m[3]);
		}

		[Fact]
		public void LLCase()
		{
			var m = Map<int, int>.Empty
				.Add(5, 1)
				.Add(4, 2)
				.Add(3, 3);

			Assert.Equal(4, m.Root.Key);
			Assert.Equal(3, m.Root.Left.Key);
			Assert.Equal(5, m.Root.Right.Key);
		}

		[Fact]
		public void TreeRemainsBalancedAfterUnbalancedInsertIntoBalancedTree()
		{
			var m = Map<int, int>.Empty
				.Add(5, 1)
				.Add(4, 2)
				.Add(3, 3)
				.Add(2, 4)
				.Add(1, 5);

			Assert.Equal(4, m.Root.Key);
			Assert.Equal(2, m.Root.Left.Key);
			Assert.Equal(1, m.Root.Left.Left.Key);
			Assert.Equal(3, m.Root.Left.Right.Key);
			Assert.Equal(5, m.Root.Right.Key);
		}

		[Fact]
		public void LRCase()
		{
			var m = Map<int, int>.Empty
				.Add(5, 1)
				.Add(3, 2)
				.Add(4, 3);

			Assert.Equal(4, m.Root.Key);
			Assert.Equal(3, m.Root.Left.Key);
			Assert.Equal(5, m.Root.Right.Key);
		}

		[Fact]
		public void RRCase()
		{
			var m = Map<int, int>.Empty
				.Add(3, 1)
				.Add(4, 2)
				.Add(5, 3);

			Assert.Equal(4, m.Root.Key);
			Assert.Equal(3, m.Root.Left.Key);
			Assert.Equal(5, m.Root.Right.Key);
		}

		[Fact]
		public void RLCase()
		{
			var m = Map<int, int>.Empty
				.Add(3, 1)
				.Add(5, 2)
				.Add(4, 3);

			Assert.Equal(4, m.Root.Key);
			Assert.Equal(3, m.Root.Left.Key);
			Assert.Equal(5, m.Root.Right.Key);
		}

        [Fact]
        public void SameKeyCase()
        {
            var m = Map<int, int>.Empty
                .Add(1, 2)
                .Add(1, 3)
                .Add(1, 4);

            Assert.Equal(4, m[1]);
        }
	}
}
